package biblioteca;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Usuario implements Comparable<Usuario> {
	private String nome,
			sobrenome,
			email,
			localizacao,
			telefone;
	private List<String> livrosLidos;
	private List<Item> itensUsados,
						itensPendentes;
	
	public List<String> getLivrosLidos() {
		return livrosLidos;
	}

	private Map<Item, Integer> notas;
	
	private Login login;

	public Usuario(String nome, String sobrenome, String email, String bloco, String sala, String telefone, String login, String senha) throws Exception {
		setNome(nome);
		setSobrenome(sobrenome);
		setEmail(email);
		setLocalizacao(bloco, sala);
		setTelefone(telefone);
		setLogin(login, senha);
		
		livrosLidos = new ArrayList<String>();
		itensUsados = new ArrayList<Item>();
		itensPendentes = new ArrayList<Item>();
		notas = new HashMap<Item, Integer>();
	}
	

	public List<Item> getItensUsados() {
		return itensUsados;
	}
	
	public void adicionaItemUsado(Item item) {
		String livro = item.toString();
		livrosLidos.add(livro);
		itensUsados.add(item);
	}
	
	public int numeroDeItensUsados() {
		return itensUsados.size();
	}

	public int notaDada(Item item) {
		return notas.get(item);
	}
	
	public void daNota(Item item, int nota) {
		notas.put(item, nota);
	}
	
	public boolean deuNota(Item item) {
		return notas.containsKey(item);
	}
	
	public List<Item> getItensPendentes() {
		return itensPendentes;
	}
	
	public void adicionaItemPendente(Item item) {
		itensPendentes.add(item);
	}

	public void removeItemPendente(Item item) {
		itensPendentes.remove(item);
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) throws Exception {
		if(nome == null || nome.isEmpty())
			throw new Exception("nome para usuario invalido");
		else
			this.nome = nome;
	}

	public String getSobrenome() {
		return sobrenome;
	}

	public void setSobrenome(String sobrenome)throws Exception {
		if(sobrenome == null || sobrenome.isEmpty())
			throw new Exception("sobrenome para usuario invalido");
		else
			this.sobrenome = sobrenome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) throws Exception {
		if(email == null || email.isEmpty())
			throw new Exception("email para usuario invalido");
		else
			this.email = email;
	}

	public String getLocalizacao() {
		return localizacao;
	}

	public void setLocalizacao(String bloco, String sala) throws Exception {
		if(bloco == null || bloco.isEmpty() || sala == null || sala.isEmpty())
			throw new Exception("nome para usuario invalido");
		else
			localizacao = "Bloco " + bloco + " - Sala " + sala;
	}
	
	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) throws Exception {
		if(telefone == null || telefone.isEmpty())
			throw new Exception("telefone para usuario invalido");
		
		for (int i = 0; i < telefone.length(); i++)
            if (!Character.isDigit(telefone.charAt(i)))  
            	throw new Exception("Telefone deve conter apenas numeros"); 
		this.telefone = telefone;
	}

	public Login getLogin() {
		return login;
	}
	
	public void setLogin(String login, String senha) throws Exception {
		if(login == null || login.isEmpty() || senha == null || senha.isEmpty())
			throw new Exception("nome para usuario invalido");
		else
			this.login = new Login(login, senha);
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (!(obj instanceof Usuario))
			return false;
		Usuario other = (Usuario) obj;
		if (email == null) {
			if (other.email != null)
				return false;
		} else if (!email.equals(other.email))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Professor " + nome + " " + sobrenome + "\n" + email + "\n" + localizacao + "\n" + telefone;
	}

	@Override
	public int compareTo(Usuario outroUsuario) {
		return outroUsuario.numeroDeItensUsados() - this.numeroDeItensUsados();
	}

}
